﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Negocio.catalogos;
using Negocio.clases_tontas;
using System.Web.Services;
using Presentacion;

namespace Presentacion.controlasistencia
{
    public partial class reportes : System.Web.UI.Page
    {
        public static int global1_codido = 0, global2_periodo = 0, global3_mes = 0;
        public static string global4_nombre = "", global5_nombrePeriodo="", global6_semestre="", global7_paralelo="", global8_carrera="";
        //objetos
        
        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
            }
        }
        #region ReporteMensual
        /// <summary>
        /// Metodo para obtener las horas semanas por distribucion
        /// </summary>
        /// <param name="_codDistribucion">filtro</param>
        /// <param name="_idPeriodo">filtro</param>
        /// <returns>horas semanales</returns>
        [System.Web.Services.WebMethod(true)]
        public static string obtenerHorasDistribucion(int _codDistribucion, int _idPeriodo, int _numeroMes, string _nombreDistribucion, string _semestre, string _paralelo, string _carrera)
        {
            ///inicializo las variables globales
            global1_codido = _codDistribucion;
            global2_periodo = _idPeriodo;
            global3_mes = _numeroMes;
            global4_nombre = _nombreDistribucion;
            global6_semestre = _semestre;
            global7_paralelo = _paralelo;
            global8_carrera = _carrera;
            //llamada al metodo obtenerDiasDistribucion

            var estudiantes = asistenciasMensual(_codDistribucion, _idPeriodo, _numeroMes);
            var horam = obtenerDiasDistribucion(_codDistribucion, _idPeriodo, _numeroMes);
            int h1 = int.Parse(horam.Key);
            int h2 = int.Parse(horam.Value);
            string valores = "";
            if ((h1 != 0 || h1==0) && (h2 != 0 ||  h2==0))
            {
                double p1 = ((double)(h1 * 100)) / (h1 + h2);
                double p2 = ((double)(h2 * 100)) / (h1 + h2);
                //obtener los estudiantes aprobados porcentaje
                string porcentaje1 = p1.ToString("0.##");
                string porcentaje2 = p2.ToString("0.##");

                //var porcentaje = porcentajeEstudiantes(_codDistribucion,_numeroMes);
                if (porcentaje1 == "NaN" && porcentaje2 == "NaN")
                {
                    valores = "No se pueden generar datos.";
                }
                else
                {
                    valores = porcentaje1 + "/" + porcentaje2;
                }
                //obtenerHorasPDF _obj = new obtenerHorasPDF(porcentaje1,porcentaje2);
                return valores;
            }
            else {
                valores = "No se puede realizar un analisis por que los datos no contienen una informacion valida.\n puede bla bla";
                return valores;   
            }
        }
        /// <summary>
        /// Obtener el los dias del horario por el codigo distribucion y el periodo
        /// </summary>
        /// <param name="_codDistribucion">filtro</param>
        /// <param name="_idPeriodo">filtro</param>
        /// <param name="_numeroMes">numero de mes del reporte</param>
        /// <returns>los dias trabajados y los dias no trabajados</returns>
        public static KeyValuePair<string, string> obtenerDiasDistribucion(int _codDistribucion, int _idPeriodo, int _numeroMes)
        {
            //objeto de catalogo horario
            catalogoHorario _objHorario = new catalogoHorario();
            var resultadoHorario = _objHorario.obtenerHorarioXidPeriodoANDidDistribucion(_idPeriodo,_codDistribucion);
            //obtener la hora diaria
            int horaDiaria = 0, horaDiaria1 = 0, horaDiaria2 = 0, horaDiaria3 = 0, horaDiaria4 = 0, horaDiaria5 = 0;
            //para asignar las horas diarias de cada dia, (para todas las horas trabajas durante el mes)
            int dia1 = 0, dia2 = 0, dia3 = 0, dia4 = 0, dia5 = 0;
            // para todas las horas no laborales antes y despues del inicio y fin del periodo
            int dia1no = 0, dia2no = 0, dia3no = 0, dia4no = 0, dia5no = 0;

            //numero de anio 
            int _numeroAnio = 0;
            //obtener la fecha actual
            DateTime fecha = DateTime.Now;
            ////variable global para el inicio y fin del periodo
            DateTime inicioPeriodo= new DateTime();
            DateTime finPeriodo= new DateTime();
            //// obtener los anios de inicio y fin de los periodos
            catalogoPeriodo _objPeriodo = new catalogoPeriodo();
            var resultadoPeriodo = _objPeriodo.obtenerPeriodo(_idPeriodo);
            //contador para la resta de los dias q si se labaron y los dias q no se laboran 
            int contador = 0;
            foreach (var item in resultadoHorario)
            {
                contador += 1;
                //obtener el mes actual
                string mes = fecha.Month.ToString();
                //obtener la hora de entrada
                DateTime horaEntrada = new DateTime(fecha.Year, fecha.Month, fecha.Day, int.Parse(item.horaEntrada.Substring(0, 2).Replace(':', ' ')), 0, 0);
                //obtener la hora de salida
                DateTime horaSalida = new DateTime(fecha.Year, fecha.Month, fecha.Day, int.Parse(item.horaSalida.Substring(0, 2).Replace(':', ' ')), 0, 0);
                //obtener el detalle del dia q es
                string dia = item.detalle.ToString();
                //restar y obtener las horas diarias
                horaDiaria = (horaSalida.Subtract(horaEntrada)).Hours;

                foreach (var item2 in resultadoPeriodo)
                {
                     inicioPeriodo = Convert.ToDateTime(item2.fechaInicio);
                     finPeriodo = Convert.ToDateTime(item2.fechaFin);
                    global5_nombrePeriodo = item2.nombre;
                    //para restar los dias del mes en los cuales no se ha trabajado durante el primer y ultimo mes
                    //mes de inicio de periodo
                    if (inicioPeriodo.Month == _numeroMes)
                    {
                        //contar los dias del mes
                        int diaInicioPeriodo = inicioPeriodo.Day;
                        _numeroAnio = inicioPeriodo.Year;
                        for (int i = 1; i <diaInicioPeriodo; i++)
                        {
                            DateTime dd = new DateTime(inicioPeriodo.Year, _numeroMes, i);
                            string diaPeriodo = dd.DayOfWeek.ToString();
                            switch (diaPeriodo)
                            {
                                case "Monday": dia1no = dia1no - horaDiaria; break;
                                case "Tuesday": dia2no = dia2no - horaDiaria; break;
                                case "Wednesday": dia3no = dia3no - horaDiaria; break;
                                case "Thursday": dia4no = dia4no - horaDiaria; break;
                                case "Friday": dia5no = dia5no - horaDiaria; break;
                                default: break;
                            }
                        }
                    }
                    //mes de fin de periodo
                    if (finPeriodo.Month == _numeroMes)
                    {
                        int diasM = DateTime.DaysInMonth(fecha.Year, _numeroMes);
                        int diaFinPeriodo = finPeriodo.Day;
                        _numeroAnio = finPeriodo.Year;
                        for (int i = diaFinPeriodo + 1; i <= diasM; i++)
                        {
                            DateTime dd = new DateTime(finPeriodo.Year, _numeroMes, i);
                            string diaPeriodo = dd.DayOfWeek.ToString();
                            switch (diaPeriodo)
                            {
                                case "Monday": dia1no = dia1no - horaDiaria; break;
                                case "Tuesday": dia2no = dia2no - horaDiaria; break;
                                case "Wednesday": dia3no = dia3no - horaDiaria; break;
                                case "Thursday": dia4no = dia4no - horaDiaria; break;
                                case "Friday": dia5no = dia5no - horaDiaria; break;
                                default: break;
                            }
                        }
                    }
                    // para asignar el anio para los meses entre medios del inicio y fin del periodo
                    if (inicioPeriodo.Month != _numeroMes && finPeriodo.Month != _numeroMes)
                    {
                        int diference = (finPeriodo.Month - inicioPeriodo.Month) + 12 * (finPeriodo.Year - inicioPeriodo.Year);
                        for (int i = 1; i <= diference; i++)
                        {
                            DateTime nueva=new DateTime();
                            int mess = inicioPeriodo.Month + i;
                            if (mess > 12)
                            {
                                mess = mess - 12;
                                nueva = new DateTime(finPeriodo.Year, mess, i);
                            }
                            if (mess < 13) 
                            {
                                nueva = new DateTime(inicioPeriodo.Year, mess, i);
                            }
                            if (nueva.Month == _numeroMes)
                            {
                                _numeroAnio = nueva.Year;
                            }
                        }
                    }
                }
                //contar los dias que trae un mes determinado
                int diasMes = DateTime.DaysInMonth(_numeroAnio, _numeroMes);
                switch (dia)
                {
                    case "Monday":
                        int dia1n = 0;
                        for (int i = 1; i <= diasMes; i++)
                        {
                            DateTime ini = new DateTime(_numeroAnio, _numeroMes, i);
                            //DateTime fin = new DateTime(fecha.Year, Convert.ToInt32(numeroMes), diasMes);
                            if (ini.DayOfWeek.ToString() == dia)
                            {
                                dia1n += 1;
                            }
                        }
                        horaDiaria1 = horaDiaria;
                        dia1 = horaDiaria1 * dia1n;
                        break;
                    case "Tuesday":
                        int dia2n = 0;
                        for (int i = 1; i <= diasMes; i++)
                        {
                            DateTime ini = new DateTime(_numeroAnio, _numeroMes, i);
                            if (ini.DayOfWeek.ToString() == dia)
                            {
                                dia2n += 1;
                            }
                        }
                        horaDiaria2 = horaDiaria;
                        dia2 = horaDiaria2 * dia2n;
                        break;
                    case "Wednesday":
                        int dia3n = 0;
                        for (int i = 1; i <= diasMes; i++)
                        {
                            DateTime ini = new DateTime(_numeroAnio, _numeroMes, i);
                            if (ini.DayOfWeek.ToString() == dia)
                            {
                                dia3n += 1;
                            }
                        }
                        horaDiaria3 = horaDiaria;
                        dia3 = horaDiaria3 * dia3n;
                        break;
                    case "Thursday":
                        int dia4n = 0;
                        for (int i = 1; i <= diasMes; i++)
                        {
                            DateTime ini = new DateTime(_numeroAnio, _numeroMes, i);
                            if (ini.DayOfWeek.ToString() == dia)
                            {
                                dia4n += 1;
                            }
                        }
                        horaDiaria4 = horaDiaria;
                        dia4 = horaDiaria4 * dia4n;
                        break;
                    case "Friday":
                        int dia5n = 0;
                        for (int i = 1; i <= diasMes; i++)
                        {
                            DateTime ini = new DateTime(_numeroAnio, _numeroMes, i);
                            if (ini.DayOfWeek.ToString() == dia)
                            {
                                dia5n += 1;
                            }
                        }
                        horaDiaria5 = horaDiaria;
                        dia5 = horaDiaria5 * dia5n;
                        break;
                    default: break;
                }
            }
            //////////////////////////////////////////////
            //obtener dias festivos con respecto al mes// 
            /////////////////////////////////////////////
            Negocio.catalogoCalendarioAcademico _objCalendar = new Negocio.catalogoCalendarioAcademico();
            List<Negocio.calendarioAcademico> _listaCalendar = new List<Negocio.calendarioAcademico>();
            ///filtro para poder obtener el calendario academico por periodo
            var resultCalendar = _objCalendar.obtenerCalendarioAcademicoxPeriodo(_idPeriodo);
            ///para los dias festivos
            int diaf1 = 0, diaf2 = 0, diaf3 = 0, diaf4 = 0, diaf5 = 0;
            
            //para obtener el dia del star
            string diaf = "";
            foreach (var item in resultCalendar)
            {
                DateTime star = Convert.ToDateTime(item.start);
                DateTime end = Convert.ToDateTime(item.end);
                DateTime filtro = new DateTime(_numeroAnio,_numeroMes, fecha.Day);
                //si es el mismo dia
                if (star == end && star.Month == filtro.Month && star.Year==filtro.Year && star>=inicioPeriodo && end<=finPeriodo)
                {
                    int cont1 = 0, cont2 = 0, cont3 = 0, cont4 = 0, cont5 = 0;
                    diaf = star.DayOfWeek.ToString();
                    switch (diaf)
                    {
                        case "Monday":
                            cont1 += 1;
                            diaf1 = diaf1 + (horaDiaria1 * cont1);
                            break;
                        case "Tuesday":
                            cont2 += 1;
                            diaf2 = diaf2 + (horaDiaria2 * cont2);
                            break;
                        case "Wednesday":
                            cont3 += 1;
                            diaf3 = diaf3 + (horaDiaria3 * cont3);
                            break;
                        case "Thursday":
                            cont4 += 1;
                            diaf4 = diaf4 + (horaDiaria4 * cont4);
                            break;
                        case "Friday":
                            cont5 += 1;
                            diaf5 = diaf5 + (horaDiaria5 * cont5);
                            break;
                        default:
                            break;
                    }
                }
                // si es el mismo mes
                else if (star.Month == end.Month && star.Month == filtro.Month && star.Day != end.Day && star.Year==filtro.Year && star>=inicioPeriodo && end<=finPeriodo)
                {
                    int diferenciaDias = (end.Subtract(star)).Days;
                    int cont1 = 0, cont2 = 0, cont3 = 0, cont4 = 0, cont5 = 0, numeroDia = 0;
                    for (int i = 0; i <= diferenciaDias; i++)
                    {
                        /// OJO  el i es para subir el numero de dia
                        /// 
                        numeroDia = star.Day + i;
                        DateTime star2 = new DateTime(star.Year, star.Month, numeroDia);
                        diaf = star2.DayOfWeek.ToString();
                        switch (diaf)
                        {
                            case "Monday":
                                cont1 += 1;
                                diaf1 = diaf1 + (horaDiaria1 * cont1);
                                break;
                            case "Tuesday":
                                cont2 += 1;
                                diaf2 = diaf2 + (horaDiaria2 * cont2);
                                break;
                            case "Wednesday":
                                cont3 += 1;
                                diaf3 = diaf3 + (horaDiaria3 * cont3);
                                break;
                            case "Thursday":
                                cont4 += 1;
                                diaf4 = diaf4 + (horaDiaria4 * cont4);
                                break;
                            case "Friday":
                                cont5 += 1;
                                diaf5 = diaf5 + (horaDiaria5 * cont5);
                                break;
                            default:
                                break;
                        }
                    }
                }
                // si es diferenc=te mes pero mismo anio
                else if (star.Month != end.Month && star.Year==filtro.Year && star>=inicioPeriodo && end<=finPeriodo)
                {
                    //trabajo con el star
                    int diasStarMes = DateTime.DaysInMonth(fecha.Year, star.Month);
                    DateTime starEnd = new DateTime(fecha.Year, star.Month, diasStarMes);
                    int diferenciaStar = (starEnd.Subtract(star)).Days;
                    //trabajo con el end
                    int diasEndMes = DateTime.DaysInMonth(fecha.Year, end.Month);
                    DateTime endEnd = new DateTime(fecha.Year, end.Month, diasEndMes);
                    int diferenciaEnd =diasEndMes-(endEnd.Subtract(end)).Days;
                    if (star.Month == filtro.Month)
                    {
                        int cont1 = 0, cont2 = 0, cont3 = 0, cont4 = 0, cont5 = 0, numeroDia = 0;
                        for (int i = 0; i <= diferenciaStar; i++)
                        {
                            numeroDia = star.Day + i;
                            DateTime star2 = new DateTime(star.Year, star.Month, numeroDia);
                            diaf = star2.DayOfWeek.ToString();
                            switch (diaf)
                            {
                                case "Monday":
                                    cont1 += 1;
                                    diaf1 = diaf1 + (horaDiaria1 * cont1);
                                    break;
                                case "Tuesday":
                                    cont2 += 1;
                                    diaf2 = diaf2 + (horaDiaria2 * cont2);
                                    break;
                                case "Wednesday":
                                    cont3 += 1;
                                    diaf3 = diaf3 + (horaDiaria3 * cont3);
                                    break;
                                case "Thursday":
                                    cont4 += 1;
                                    diaf4 = diaf4 + (horaDiaria4 * cont4);
                                    break;
                                case "Friday":
                                    cont5 += 1;
                                    diaf5 = diaf5 + (horaDiaria5 * cont5);
                                    break;
                                default:
                                    break;
                            }
                        }
                    }
                    else if (end.Month == filtro.Month)
                    {
                        int cont1 = 0, cont2 = 0, cont3 = 0, cont4 = 0, cont5 = 0;
                        for (int i = diferenciaEnd - 1; i >= 0; i--)
                        {
                            //captura el numero de dia del evento
                            //numeroDia = end.Day + i;
                            DateTime end2 = new DateTime(star.Year, end.Month, i+1);
                            diaf = end2.DayOfWeek.ToString();
                            switch (diaf)
                            {
                                case "Monday":
                                    cont1 += 1;
                                    diaf1 = diaf1 + (horaDiaria1 * cont1);
                                    break;
                                case "Tuesday":
                                    cont2 += 1;
                                    diaf2 = diaf2 + (horaDiaria2 * cont2);
                                    break;
                                case "Wednesday":
                                    cont3 += 1;
                                    diaf3 = diaf3 + (horaDiaria3 * cont3);
                                    break;
                                case "Thursday":
                                    cont4 += 1;
                                    diaf4 = diaf4 + (horaDiaria4 * cont4);
                                    break;
                                case "Friday":
                                    cont5 += 1;
                                    diaf5 = diaf5 + (horaDiaria5 * cont5);
                                    break;
                                default:
                                    break;
                            } 
                        }
                    }
                }
                //diferente mes y diferentes anios y anio anterior
                else if (star.Month!=end.Month && star.Year!= end.Year && star.Year==filtro.Year && star>=inicioPeriodo && end<=finPeriodo)
                {
                    //trabajo con el star
                    int diasStarMes = DateTime.DaysInMonth(fecha.Year, star.Month);
                    DateTime starEnd = new DateTime(fecha.Year, star.Month, diasStarMes);
                    int diferenciaStar = (starEnd.Subtract(star)).Days;
                    if (star.Month == filtro.Month)
                    {
                        int cont1 = 0, cont2 = 0, cont3 = 0, cont4 = 0, cont5 = 0, numeroDia = 0;
                        for (int i = 0; i <= diferenciaStar; i++)
                        {
                            numeroDia = star.Day + i;
                            DateTime star2 = new DateTime(star.Year, star.Month, numeroDia);
                            diaf = star2.DayOfWeek.ToString();
                            switch (diaf)
                            {
                                case "Monday":
                                    cont1 += 1;
                                    diaf1 = diaf1 + (horaDiaria1 * cont1);
                                    break;
                                case "Tuesday":
                                    cont2 += 1;
                                    diaf2 = diaf2 + (horaDiaria2 * cont2);
                                    break;
                                case "Wednesday":
                                    cont3 += 1;
                                    diaf3 = diaf3 + (horaDiaria3 * cont3);
                                    break;
                                case "Thursday":
                                    cont4 += 1;
                                    diaf4 = diaf4 + (horaDiaria4 * cont4);
                                    break;
                                case "Friday":
                                    cont5 += 1;
                                    diaf5 = diaf5 + (horaDiaria5 * cont5);
                                    break;
                                default:
                                    break;
                            }
                        }
                    }
                }
                //diferentes mes y diferentes anios y anio posterior
                else if (star.Month != end.Month && star.Year != end.Year && end.Year == filtro.Year && star>=inicioPeriodo && end<=finPeriodo)
                {
                    //trabajo con el end
                    int diasEndMes = DateTime.DaysInMonth(fecha.Year, end.Month);
                    DateTime endEnd = new DateTime(fecha.Year, end.Month, diasEndMes);
                    int diferenciaEnd = diasEndMes - (endEnd.Subtract(end)).Days;
                    if(end.Month == filtro.Month)
                    {
                        int cont1 = 0, cont2 = 0, cont3 = 0, cont4 = 0, cont5 = 0;
                        for (int i = diferenciaEnd - 1; i >= 0; i--)
                        {
                            //captura el numero de dia del evento
                            //numeroDia = end.Day + i;
                            DateTime end2 = new DateTime(end.Year, end.Month, i + 1);
                            diaf = end2.DayOfWeek.ToString();
                            switch (diaf)
                            {
                                case "Monday":
                                    cont1 += 1;
                                    diaf1 = diaf1 + (horaDiaria1 * cont1);
                                    break;
                                case "Tuesday":
                                    cont2 += 1;
                                    diaf2 = diaf2 + (horaDiaria2 * cont2);
                                    break;
                                case "Wednesday":
                                    cont3 += 1;
                                    diaf3 = diaf3 + (horaDiaria3 * cont3);
                                    break;
                                case "Thursday":
                                    cont4 += 1;
                                    diaf4 = diaf4 + (horaDiaria4 * cont4);
                                    break;
                                case "Friday":
                                    cont5 += 1;
                                    diaf5 = diaf5 + (horaDiaria5 * cont5);
                                    break;
                                default:
                                    break;
                            }
                        }
                    }
                }
            }
            ///para calcular la sumatoria finales de los dias trabajados
            int sumadia1 = 0, sumadia2 = 0, sumadia3 = 0, sumadia4 = 0, sumadia5 = 0;
            //restos los dias anteriores q no se toman en cuenta al inicio y fin de los periodos
            //dia1.. todas las horas trabajas teoricamente durante un mes
            //dia1no... todas las horas anteriores al inicio  del periodo lectivo q sse cuentan como horas no laboradas
            if (dia1 != 0)
            {
                dia1no = dia1no / contador;
                dia1 = dia1 + dia1no;
            } if (dia2 != 0)
            {
                dia2no = dia2no / contador;
                dia2 = dia2 + dia2no;
            } if (dia3 != 0)
            {
                dia3no = dia3no / contador;
                dia3 = dia3 + dia3no;
            } if (dia4 != 0)
            {
                dia4no = dia4no / contador;
                dia4 = dia4 + dia4no;
            } if (dia5 != 0)
            {
                dia5no = dia5no / contador;
                dia5 = dia5 + dia5no;
            }
            
            sumadia1 = dia1 - diaf1;
            sumadia2 = dia2 - diaf2;
            sumadia3 = dia3 - diaf3;
            sumadia4 = dia4 - diaf4;
            sumadia5 = dia5 - diaf5;
            int horasMensualesTrabajadas = sumadia1 + sumadia2 + sumadia3 + sumadia4 + sumadia5;
            //para sumar los dias NO trabajados
            int horasMensualesNoTrabajadas = diaf1 + diaf2 + diaf3 + diaf4 + diaf5;
            return new KeyValuePair<string, string>(horasMensualesTrabajadas.ToString(), horasMensualesNoTrabajadas.ToString());
        }
        #endregion ReporteMensual

        #region ReporteMensualPdf
        /// <summary>
        /// clase catalogo para obtener los datos en el reportviewer 
        /// </summary>
        public class Horas
        {
            //declaro el valor de las horas trabajadas y el nombres de esas horas
            private string horas_name;
            private int valor_horas;
            private string mes_name;
            private string materia_name;
            private int horas_tra;
            private int horas_NO_tra;
            private string nombre_periodo;
            private string nombre_semestre,nombre_paralelo,nombre_carrera;
            public Horas(string name, int valor, string mes, string _nombrePeriodo, string materia, int horas_si,int horas_no, string _semes,string _paralelo, string _carrera)
            {
                horas_name = name;
                valor_horas = valor;
                mes_name = mes;
                materia_name = materia;
                horas_tra = horas_si;
                horas_NO_tra = horas_no;
                nombre_periodo = _nombrePeriodo;
                nombre_semestre = _semes;
                nombre_paralelo = _paralelo;
                nombre_carrera = _carrera;
            }

            public string HorasName
            {
                get
                {
                    return horas_name;
                }
            }

            public int HorasValor
            {
                get
                {
                    return valor_horas;
                }
            }
            public string MesName
            {
                get
                {
                    return mes_name;
                }
            }
            public string MateriaName
            {
                get
                {
                    return materia_name;
                }
            }
            public string NombrePeriodo
            {
                get 
                {
                    return nombre_periodo;
                }
            }
            public int HorasTrabajadas
            {
                get
                {
                    return horas_tra;
                }
            }
            public int HorasNoTrabajadas
            {
                get
                {
                    return horas_NO_tra;
                }
            }
            public string NombreSemestre
            {
                get
                {
                    return nombre_semestre;
                }
            }
            public string NombreParalelo
            {
                get
                {
                    return nombre_paralelo;
                }
            }
            public string NombreCarrera
            {
                get 
                {
                    return nombre_carrera;
                }
            }
        }
        public class obtenerHorasPDF
        {
            private List<Horas> _lista;
            public obtenerHorasPDF()
            {
                if (global1_codido != 0 && global2_periodo != 0 && global3_mes != 0 && global4_nombre != "")
                {
                    string cadena = obtenerHorasDistribucion(global1_codido, global2_periodo, global3_mes, global4_nombre,global6_semestre, global7_paralelo, global8_carrera).ToString();
                    string[] split = cadena.Split(new Char[] { '/' });
                    /// paso de las horas
                    int v1 = int.Parse(split[0]);
                    int v2 = int.Parse(split[1]);
                    int v3 = int.Parse(split[2]);
                    int v4 = int.Parse(split[3]);
                    /// paso del mes 
                    string mes = "";
                    switch (global3_mes)
                    {
                        case 1: mes = "Enero"; break;
                        case 2: mes = "Febrero"; break;
                        case 3: mes = "Marzo"; break;
                        case 4: mes = "Abril"; break;
                        case 5: mes = "Mayo"; break;
                        case 6: mes = "Junio"; break;
                        case 7: mes = "Julio"; break;
                        case 8: mes = "Agosto"; break;
                        case 9: mes = "Septiembre"; break;
                        case 10: mes = "Octubre"; break;
                        case 11: mes = "Noviembre"; break;
                        case 12: mes = "Diciembre"; break;
                        default: break;
                    }
                    _lista = new List<Horas>();
                    _lista.Add(new Horas("Horas trabajadas", v1, mes, global5_nombrePeriodo, global4_nombre, v3,v4, global6_semestre,global7_paralelo, global8_carrera));
                    _lista.Add(new Horas("Horas NO trabajas", v2, mes, global5_nombrePeriodo, global4_nombre,v3,v4,global6_semestre,global7_paralelo,global8_carrera));
                }
            }
            //public obtenerHorasPDF()
            //{
            //    // TODO: Complete member initialization
            //}
            public List<Horas> GetHoras()
            {
                return _lista;
            }
        }
        #endregion ReporteMensualPdf

        #region ReporteGeneralHoras
        /// <summary>
        /// para obtener ell porcentale de horas general durante un periodo, el detallado de las horas de cada mes y el porcentaje de estudiantes aprobados
        /// </summary>
        /// <param name="_periodo">filtro</param>
        /// <param name="_codigo">filtro</param>
        /// <param name="_materia">nommbre materia</param>
        /// <param name="_semestre">numero de semestre</param>
        /// <param name="_paralelo">paralelo</param>
        /// <param name="_carrera">nombre de la carrera</param>
        /// <returns></returns>
        [System.Web.Services.WebMethod(true)]
        public static string obtenerReporteGeneral(int _periodo, int _codigo, string _materia, string _semestre, string _paralelo, string _carrera) 
        {
            ///inicializo las variabes globales :D :3 
            global4_nombre = _materia;
            global6_semestre = _semestre;
            global7_paralelo = _paralelo;
            global8_carrera = _carrera;

            var horasTrabajadasGeneral = obtenerHorasSemestral(_periodo,_codigo);
            string horas=obtenerHorasGeneral(_periodo,_codigo);
            string[] split = horas.Split(new Char[] { '/'});
            //calcular porcentajes de horas generales
            int h1 = int.Parse(split[0]); int h2 = int.Parse(split[1]);
            //mes 1
            int h3 = int.Parse(split[2]); int h4 = int.Parse(split[3]);
            //mes 2
            int h5 = int.Parse(split[4]); int h6 = int.Parse(split[5]);
            //mes 3
            int h7 = int.Parse(split[6]); int h8 = int.Parse(split[7]);
            //mes 4
            int h9 = int.Parse(split[8]); int h10 = int.Parse(split[9]);
            //mes 5
            int h11 = int.Parse(split[10]); int h12 = int.Parse(split[11]);
            //mes 6
            int h13 = int.Parse(split[12]); int h14 = int.Parse(split[13]);
            //mes 7
            int h15 = int.Parse(split[14]); int h16 = int.Parse(split[15]);
            //mes 8
            int h17 = int.Parse(split[16]); int h18 = int.Parse(split[17]);
            //mes 9
            int h19 = int.Parse(split[18]); int h20 = int.Parse(split[19]);
            //mes 10
            int h21 = int.Parse(split[20]); int h22 = int.Parse(split[21]);
            //mes 11
            int h23 = int.Parse(split[22]); int h24 = int.Parse(split[23]);
            //mes 12
            int h25 = int.Parse(split[24]); int h26 = int.Parse(split[25]);

            double p1 = ((double)(h1 * 100)) / (h1 + h2);
            double p2 = ((double)(h2 * 100)) / (h1 + h2);
            string porcentaje1 = p1.ToString("0.##");
            string porcentaje2 = p2.ToString("0.##");
            //ALGORITO 2048 con inversion mulpitle kagebushing not jutsu XD 
            string datosBar = "";
            int residuo = _periodo % 2;
            if (residuo == 0)
            {
                if (h3 > 0 || h4 > 0)
                {
                    datosBar = "Enero,"+h3+","+h4+",";
                } if (h5 > 0 || h6 > 0)
                {
                    datosBar = datosBar + "Febrero," + h5 + "," + h6 + ",";
                } if (h7 > 0 || h8 > 0)
                {
                    datosBar = datosBar + "Marzo," + h7 + "," + h8 + ",";
                } if (h9 > 0 || h10 > 0)
                {
                    datosBar = datosBar + "Abril," + h9 + "," + h10 + ",";
                } if (h11 > 0 || h12 > 0)
                {
                    datosBar = datosBar + "Mayo," + h11 + "," + h12 + ",";
                } if (h13 > 0 || h14 > 0)
                {
                    datosBar = datosBar + "Junio," + h13 + "," + h14 + ",";
                } if (h15 > 0 || h16 > 0)
                {
                    datosBar = datosBar + "Julio," + h15 + "," + h16 + ",";
                } if (h17 > 0 || h18 > 0)
                {
                    datosBar = datosBar + "Agosto," + h17 + "," + h18 + ",";
                } if (h19 > 0 || h20 > 0)
                {
                    datosBar = datosBar + "Septiembre," + h19 + "," + h20 + ",";
                } if (h21 > 0 || h22 > 0)
                {
                    datosBar = datosBar + "Octubre," + h21 + "," + h22 + ",";
                } if (h23 > 0 || h24 > 0)
                {
                    datosBar = datosBar + "Noviembre," + h23 + "," + h24 + ",";
                } if (h25 > 0 || h26 > 0)
                {
                    datosBar = datosBar + "Diciembre," + h25 + "," + h26 + ",";
                }
            }
            else 
            {
                if (h13 > 0 || h14 > 0)
                {
                    datosBar = "Junio," + h13 + "," + h14 + ",";
                } if (h15 > 0 || h16 > 0)
                {
                    datosBar = datosBar + "Julio," + h15 + "," + h16 + ",";
                } if (h17 > 0 || h18 > 0)
                {
                    datosBar = datosBar + "Agosto," + h17 + "," + h18 + ",";
                } if (h19 > 0 || h20 > 0)
                {
                    datosBar = datosBar + "Septiembre," + h19 + "," + h20 + ",";
                } if (h21 > 0 || h22 > 0)
                {
                    datosBar = datosBar + "Octubre," + h21 + "," + h22 + ",";
                } if (h23 > 0 || h24 > 0)
                {
                    datosBar = datosBar + "Noviembre," + h23 + "," + h24 + ",";
                } if (h25 > 0 || h26 > 0)
                {
                    datosBar = datosBar + "Diciembre," + h25 + "," + h26 + ",";
                } if (h3 > 0 || h4 > 0)
                {
                    datosBar =datosBar + "Enero," + h3 + "," + h4 + ",";
                } if (h5 > 0 || h6 > 0)
                {
                    datosBar = datosBar + "Febrero," + h5 + "," + h6 + ",";
                } if (h7 > 0 || h8 > 0)
                {
                    datosBar = datosBar + "Marzo," + h7 + "," + h8 + ",";
                } if (h9 > 0 || h10 > 0)
                {
                    datosBar = datosBar + "Abril," + h9 + "," + h10 + ",";
                } if (h11 > 0 || h12 > 0)
                {
                    datosBar = datosBar + "Mayo," + h11 + "," + h12 + ",";
                } 
            }
            string retorno=porcentaje1+"$"+porcentaje2+"$"+datosBar;
            return retorno;
        }
        /// <summary>
        /// para obtener el porcentaje de horas general y el detallado de las horas de cada uno de los meses
        /// </summary>
        /// <param name="_periodo">filtro</param>
        /// <param name="_codigo">filtro</param>
        /// <returns></returns>
        public static string obtenerHorasGeneral(int _periodo, int _codigo) 
        {
            //declaramos objeto periodo para traer las fechas y poder sacar los meses
            catalogoPeriodo _objPeriodo = new catalogoPeriodo();
            var resultadoPeriodo = _objPeriodo.obtenerPeriodo(_periodo);
            //
            string mes1="",mes2="",mes3="",mes4="",mes5="",mes6="",mes7="",mes8="",mes9="",mes10="",mes11="",mes12="";
            //
            int t1=0, tn1=0,t2=0, tn2=0,t3=0, tn3=0,t4=0, tn4=0,t5=0, tn5=0,t6=0, tn6=0,t7=0, tn7=0,t8=0, tn8=0,t9=0, tn9=0,t10=0, tn10=0,t11=0, tn11=0,t12=0, tn12=0;
            //sumatorias
            int horasTrabajadas = 0,horasNoTrabajadas = 0;
            if (resultadoPeriodo.Count() > 0) 
            {
                foreach (var item in resultadoPeriodo)
                {
                    DateTime fin = Convert.ToDateTime(item.fechaFin);
                    DateTime ini = Convert.ToDateTime(item.fechaInicio);
                    int diferenciaMeses = (fin.Month - ini.Month) + 12 * (fin.Year - ini.Year);
                    for (int i = 0; i <= diferenciaMeses; i++)
                    {
                        int inicio = ini.Month + i;
                        if (inicio > 12) {
                            inicio = inicio - 12;
                        }
                        if (inicio==1)
                        {
                        var horas=obtenerDiasDistribucion(_codigo,_periodo,1);
                        t1 = int.Parse(horas.Key);
                        tn1 = int.Parse(horas.Value);
                        mes1=t1+"/"+tn1;
                        }
                        else if (inicio == 2)
                        {
                            var horas = obtenerDiasDistribucion(_codigo, _periodo, 2);
                            t2 = int.Parse(horas.Key);
                            tn2 = int.Parse(horas.Value);
                            mes2 = t2 + "/" + tn2;
                        }
                        else if (inicio == 3)
                        {
                            var horas = obtenerDiasDistribucion(_codigo, _periodo, 3);
                            t3 = int.Parse(horas.Key);
                            tn3 = int.Parse(horas.Value);
                            mes3 = t3 + "/" + tn3;
                        }
                        else if (inicio == 4)
                        {
                            var horas = obtenerDiasDistribucion(_codigo, _periodo, 4);
                            t4 = int.Parse(horas.Key);
                            tn4 = int.Parse(horas.Value);
                            mes4 = t4 + "/" + tn4;
                        }
                        else if (inicio == 5)
                        {
                            var horas = obtenerDiasDistribucion(_codigo, _periodo, 5);
                            t5 = int.Parse(horas.Key);
                            tn5 = int.Parse(horas.Value);
                            mes5 = t5 + "/" + tn5;
                        }
                        else if (inicio == 6)
                        {
                            var horas = obtenerDiasDistribucion(_codigo, _periodo, 6);
                            t6 = int.Parse(horas.Key);
                            tn6 = int.Parse(horas.Value);
                            mes6 = t6 + "/" + tn6;
                        }
                        else if (inicio == 7)
                        {
                            var horas = obtenerDiasDistribucion(_codigo, _periodo, 7);
                            t7 = int.Parse(horas.Key);
                            tn7 = int.Parse(horas.Value);
                            mes7 = t7 + "/" + tn7;
                        }
                        else if (inicio == 8)
                        {
                            var horas = obtenerDiasDistribucion(_codigo, _periodo, 8);
                            t8 = int.Parse(horas.Key);
                            tn8 = int.Parse(horas.Value);
                            mes8 = t8 + "/" + tn8;
                        }
                        else if (inicio == 9)
                        {
                            var horas = obtenerDiasDistribucion(_codigo, _periodo, 9);
                            t9 = int.Parse(horas.Key);
                            tn9 = int.Parse(horas.Value);
                            mes9 = t9 + "/" + tn9;
                        }
                        else if (inicio == 10)
                        {
                            var horas = obtenerDiasDistribucion(_codigo, _periodo, 10);
                            t10 = int.Parse(horas.Key);
                            tn10 = int.Parse(horas.Value);
                            mes10 = t10 + "/" + tn10;
                        }
                        else if (inicio == 11)
                        {
                            var horas = obtenerDiasDistribucion(_codigo, _periodo, 11);
                            t11 = int.Parse(horas.Key);
                            tn11 = int.Parse(horas.Value);
                            mes11 = t11 + "/" + tn11;
                        }
                        else if (inicio == 12)
                        {
                            var horas = obtenerDiasDistribucion(_codigo, _periodo, 12);
                            t12 = int.Parse(horas.Key);
                            tn2 = int.Parse(horas.Value);
                            mes12 = t12 + "/" + tn12;
                        }
                    }

                }
            }
            if (mes1 == "") { mes1 = "0/0";}
            if (mes2 == "") { mes2 = "0/0"; }
            if (mes3 == "") { mes3 = "0/0"; }
            if (mes4 == "") { mes4 = "0/0"; }
            if (mes5 == "") { mes5 = "0/0"; }
            if (mes6 == "") { mes6 = "0/0"; }
            if (mes7 == "") { mes7 = "0/0"; }
            if (mes8 == "") { mes8 = "0/0"; }
            if (mes9 == "") { mes9 = "0/0"; }
            if (mes10 == "") { mes10 = "0/0"; }
            if (mes11 == "") { mes11 = "0/0"; }
            if (mes12 == "") { mes12 = "0/0"; }
            horasTrabajadas = t1 + t2 + t3 + t4 + t5 + t6 + t7 + t8 + t9 + t10 + t11 + t12;
            horasNoTrabajadas = tn1 + tn2 + tn3 + tn4 + tn5 + tn6 + tn7 + tn8 + tn9 + tn10 + tn11 + tn12;
            string resultado = horasTrabajadas + "/" + horasNoTrabajadas+"/"+mes1+"/"+mes2+"/"+mes3+"/"+mes4+"/"+mes5+"/"+mes6+"/"+mes7+"/"+mes8+"/"+mes9+"/"+mes10+"/"+mes11+"/"+mes12;
            return resultado;
        }
        #endregion ReporteGeneralHoras

        #region ReportesGeneralPDF


        #endregion
        
        #region AsistenciasEstudiantesMensual
        /// <summary>
        /// metodo para obtener las horas trabajadas y las horas no trabajadas (pendiente) MENSUAL
        /// </summary>
        /// <param name="_codDistribucion">filtro</param>
        /// <param name="_periodo">filtro</param>
        /// <param name="_mes">filtro</param>
        /// <returns>las hroas trabajadas y no trabajadas</returns>
        public static string asistenciasMensual(int _codDistribucion, int _periodo, int _mes) 
        {
            catalogoCabecera _objC = new catalogoCabecera();
            catalogoHorario _objH= new catalogoHorario();
            int contador = 0, horaDiaria=0;
            DateTime fecha = DateTime.Now;
            var resultHorario = _objH.obtenerHorarioXidPeriodoANDidDistribucion(_periodo,_codDistribucion);
            var resultCabecera = from filtro in _objC.obtenerCabeceraXIdDistribucionANDidPerido(_codDistribucion, _periodo) where filtro.fechaCabecera.Month == _mes select filtro;
            foreach (var item in resultCabecera)
            {
                if (item.fechaCabecera.Month == _mes)
                {
                    foreach (var item2 in resultHorario)
                    {
                        if (item.fechaCabecera.DayOfWeek.ToString()==item2.detalle)
                        {
                            //obtener la hora de entrada
                            DateTime horaEntrada = new DateTime(fecha.Year, fecha.Month, fecha.Day, int.Parse(item2.horaEntrada.Substring(0, 2).Replace(':', ' ')), 0, 0);
                            //obtener la hora de salida
                            DateTime horaSalida = new DateTime(fecha.Year, fecha.Month, fecha.Day, int.Parse(item2.horaSalida.Substring(0, 2).Replace(':', ' ')), 0, 0);
                            horaDiaria = (horaSalida.Subtract(horaEntrada)).Hours;
                            contador += horaDiaria;
                        }
                    }
                }
            }
            return contador.ToString()+"|";
        }
        #endregion

        #region obtenerHorasSemestral
        public static string obtenerHorasSemestral(int _periodo, int _codDistribucion)
        {
            catalogoCabecera _obj = new catalogoCabecera();
            var horasAcumuladas = _obj.obtenerHorasTrabajadasAcumuladas(_codDistribucion,_periodo);
            return horasAcumuladas.ToString();
        }
        #endregion
        
        #region PorcentajeEstudiantesMensualesAprobados
        public static string estudiantesMensuales(int _codDistribucion, int _periodo, int mes) 
        {
            catalogoAsistencia _objA = new catalogoAsistencia();
            catalogoEstudiante _objE = new catalogoEstudiante();
            catalogoPeriodo _objP= new catalogoPeriodo();
            DateTime desde;
            DateTime hasta;
            DateTime filtro2= new DateTime(); 
            DateTime filtro1=new DateTime();
            int diasM=default(int);
            ////// obtener periodo
            var periodo =_objP.obtenerPeriodo(_periodo);
                foreach (var item in periodo)
	            {
		           desde=Convert.ToDateTime(item.fechaInicio);
                   hasta=Convert.ToDateTime(item.fechaFin);
                   
                    if (desde.Year!=hasta.Year)
                    {
                        ///para determinar si el mes pertenece al a;o siguiente o anterior del periodo
                        if (mes>6)
                        {
                            diasM = DateTime.DaysInMonth(hasta.Year, mes);
                            filtro1 = new DateTime(desde.Year, mes, 1);
                            filtro2 = new DateTime(desde.Year, mes, diasM);
                        }
                        else
                        {
                            diasM = DateTime.DaysInMonth(hasta.Year, mes);
                            filtro1 = new DateTime(hasta.Year, mes, 1);
                            filtro2 = new DateTime(hasta.Year, mes, diasM);
                        }
                    }
                    else
                    {
                        diasM = DateTime.DaysInMonth(hasta.Year, mes);
                        filtro1 = new DateTime(desde.Year, mes, 1);
                        filtro2 = new DateTime(hasta.Year, mes,diasM);
                    }
	            }
            var listaEstudiantes = _objE.obtenerEstudiante(_codDistribucion);
            ///variables
            int asistencias = default(int), faltas = default(int), justificaciones = default(int);
            foreach (var item in listaEstudiantes)
            {
                var tipos = _objA.obtenerAsistenciaxIDCabeceraANDidEstudianteANDFechaALL(item.Id_Alumno,filtro1.Date.ToString(),filtro2.Date.ToString());
                foreach (var item2 in tipos)
                {
                    if (Convert.ToInt32(item2.idTipo)==1)
                    {
                        asistencias += 1;   
                    }
                    else if (Convert.ToInt32(item2.idTipo) == 2)
                    {
                        justificaciones += 1;
                    }
                    else
                    {
                        faltas += 1;
                    }
                }
            }
            int total=0;
            total = asistencias + justificaciones + faltas;
            double pAsistencias = ((double)(asistencias * 100)) / (total);
            double pJustificadas = ((double)(asistencias * 100)) / (total);
            double pFaltas = ((double)(asistencias * 100)) / (total);
            return "";
        }
        #endregion

        #region EstudiantesGeneralAprobados
        public static string estudiantesGeneral(int _codDistribucion, int _periodo)
        {
        catalogoAsistencia _objA = new catalogoAsistencia();
            catalogoEstudiante _objE = new catalogoEstudiante();
            catalogoPeriodo _objP= new catalogoPeriodo();
            DateTime filtro2= new DateTime(); 
            DateTime filtro1=new DateTime();
            ////// obtener periodo
            var periodo =_objP.obtenerPeriodo(_periodo);
                foreach (var item in periodo)
	            {
                    filtro1 = Convert.ToDateTime(item.fechaInicio);
                    filtro2 = Convert.ToDateTime(item.fechaFin);
	            }
            var listaEstudiantes = _objE.obtenerEstudiante(_codDistribucion);
            ///variables
            int asistencias = default(int), faltas = default(int), justificaciones = default(int);
            foreach (var item in listaEstudiantes)
            {
                var tipos = _objA.obtenerAsistenciaxIDCabeceraANDidEstudianteANDFechaALL(item.Id_Alumno,filtro1.Date.ToString(),filtro2.Date.ToString());
                foreach (var item2 in tipos)
                {
                    if (Convert.ToInt32(item2.idTipo)==1)
                    {
                        asistencias += 1;   
                    }
                    else if (Convert.ToInt32(item2.idTipo) == 2)
                    {
                        justificaciones += 1;
                    }
                    else
                    {
                        faltas += 1;
                    }
                }
            }
            int total=0;
            total = asistencias + justificaciones + faltas;
            double pAsistencias = ((double)(asistencias * 100)) / (total);
            double pJustificadas = ((double)(asistencias * 100)) / (total);
            double pFaltas = ((double)(asistencias * 100)) / (total);
            return "";
        }
        #endregion
    }
}
